package org.ragdollcat.secondaiagent.app;

import jakarta.annotation.Resource;
import org.ragdollcat.secondaiagent.tool.SystemDateTimeTool;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.ChatOptions;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.model.tool.DefaultToolCallingManager;
import org.springframework.ai.model.tool.ToolCallingChatOptions;
import org.springframework.ai.model.tool.ToolCallingManager;
import org.springframework.ai.model.tool.ToolExecutionResult;
import org.springframework.ai.tool.ToolCallback;
import org.springframework.ai.tool.ToolCallbacks;
import org.springframework.stereotype.Component;

@Component
public class ChatToolsApp {

    @Resource
    private ChatModel dashscopeChatModel;

    public String testChatTools() {

        ChatOptions chatOptions = ToolCallingChatOptions.builder()
                .toolCallbacks(ToolCallbacks.from(new SystemDateTimeTool()))
                .internalToolExecutionEnabled(false)
                .build();
        // 创建工具调用管理器
        ToolCallingManager toolCallingManager = DefaultToolCallingManager.builder().build();

        // 创建初始提示
        Prompt prompt = new Prompt("获取当前系统的日期时间", chatOptions);
        // 传递用户问题给大模型 ，大模型分析用户问题，判断是否需要使用工具，响应工具名称和参数到ChatResponse
        ChatResponse chatResponse = dashscopeChatModel.call(prompt);
        // ChatResponse的hasToolCalls不为空，证明大模型认为需要调用工具
        while (chatResponse.hasToolCalls()) {
            // 接收工具调用的请求，选择和大模型响应工具名称相匹配的工具，然后调用该工具，。
            ToolExecutionResult toolExecutionResult = toolCallingManager.executeToolCalls(prompt, chatResponse);
            // 创建包含工具结果的新提示
            prompt = new Prompt(toolExecutionResult.conversationHistory(), chatOptions);
            // 再次发送请求给模型，生成最终的回答
            chatResponse = dashscopeChatModel.call(prompt);
        }

// 获取最终回答
        System.out.println(chatResponse.getResult().getOutput().getText());
        return chatResponse.getResult().getOutput().getText();
    }


}
